#include "impresor_de_resultados.h"
#include "condicion_de_relacion.h"

std::string ImpresorDeResultados::traducirNodoResultado (CondicionDeRelacion condicion){
	switch (condicion.getDescriptor()){
	case PROMEDIO_MAYOR_A_CUATRO:
		if(condicion.getValorDescriptor()){
			return "tienen promedio mayor a cuatro.\n";
		}else{
			return "no tienen promedio mayor a cuatro.\n";
		}
	case ES_HOMBRE:
		if(condicion.getValorDescriptor()){
			return "son hombres, ";
		}else{
			return "son mujeres, ";
		}
	case MAYOR_DE_VEINTICUATRO:
		if(condicion.getValorDescriptor()){
			return "son mayores de veinticuatro años, ";
		}else{
			return "no son mayores de veinticuatro años, ";
		}
	case TRABAJA:
		if(condicion.getValorDescriptor()){
			return "trabajan, ";
		}else{
			return "no trabajan, ";
		}
	case ESTUDIA_SEIS_HORAS_SEMANALES:
		if(condicion.getValorDescriptor()){
			return "estudia al menos seis horas por semana, ";
		}else{
			return "estudia menos de seis horas por semana, ";
		}
	}
	return "";
}


void ImpresorDeResultados::imprimirColaDeResultados (Pila<CondicionDeRelacion>& pilaAImprimir){
	Pila<CondicionDeRelacion> pilaAux;
	CondicionDeRelacion DescriptorAux;
	if (!pilaAImprimir.estaVacia()){
		DescriptorAux=pilaAImprimir.pop();
		if (pilaAImprimir.estaVacia()){
			if(DescriptorAux.getValorDescriptor()){
				std::cout << "Todos los alumnos tienen promedio mayor a cuatro" << std::endl;
			}else{
				std::cout << "Nigung alumno tiene promedio mayor a cuatro" << std::endl;
			}
			pilaAImprimir.push(DescriptorAux);
		}else{
			pilaAImprimir.push(DescriptorAux);
			while(!pilaAImprimir.estaVacia()){
				pilaAux.push(pilaAImprimir.pop());
			}
			std::cout<< "Los alumnos que ";
			while(!pilaAux.estaVacia()){
				DescriptorAux=pilaAux.pop();
				std::cout<< this->traducirNodoResultado(DescriptorAux);
				pilaAImprimir.push(DescriptorAux);
			}
		}
	}
}

void ImpresorDeResultados::imprimirArbolNodoResultado (NodoArbolBinario<DescriptorAlumno>* raiz, Pila<CondicionDeRelacion>& pilaActual){
	CondicionDeRelacion descriptorActual;
	descriptorActual.setDescriptor(raiz->getDato());
	if ((raiz->getHijoIzquierdo()!=raiz)&&(raiz->getHijoIzquierdo()!=0)){
		descriptorActual.setValorDescriptor(false);
		pilaActual.push(descriptorActual);
		this->imprimirArbolNodoResultado(raiz->getHijoIzquierdo(),pilaActual);
	}
	else{
		if (raiz->getHijoIzquierdo()==raiz){
			descriptorActual.setValorDescriptor(false);
			pilaActual.push(descriptorActual);
			this->imprimirColaDeResultados(pilaActual);

		}
	}
	if ((raiz->getHijoDerecho()!=raiz)&&(raiz->getHijoDerecho()!=0)){
			pilaActual.pop();
			descriptorActual.setValorDescriptor(true);
			pilaActual.push(descriptorActual);
			this->imprimirArbolNodoResultado(raiz->getHijoDerecho(),pilaActual);
	}
	else{
		if (raiz->getHijoDerecho()==raiz){
			descriptorActual.setValorDescriptor(true);
			pilaActual.push(descriptorActual);
			this->imprimirColaDeResultados(pilaActual);

		}
	}

	pilaActual.pop();
}


void ImpresorDeResultados::imprimirResultado (Resultado& resultado){
	Pila<CondicionDeRelacion> pilaActual;
	this->imprimirArbolNodoResultado(resultado.getArbolDeRelaciones()->getRaiz(),pilaActual);
}

